package com.easthome.listener;

import com.easthome.entity.Brands;
import com.easthome.entity.GoodsType;
import com.easthome.service.GoodsService;
import com.easthome.service.GoodsTypeService;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.SneakyThrows;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionListener;
import java.util.List;

/**
 * 监听器是用来 监听的。
 * 我们可以在web.xml中配置多个监听器，念念 负责楼下大门开没开，、饼饼 咱屋门开没开、花花 咱屋只要进来一个人，
 * 监听器 只是提供了一下，咱们的代码想啥时候运行。
 *
 * 商品类别列表、品牌列表
 * @author cxiaoy
 * @Date 2022/10/14 17:01
 */
public class GoodsTypeListener implements ServletContextListener {

    @SneakyThrows
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        //在这个方法中，我们去后台查数据库，
        //用getBean的方式获取goodsService
        ServletContext servletContext = sce.getServletContext();
        WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);//获取srping容器
        GoodsTypeService goodsTypeService = context.getBean("goodsTypeServiceImpl", GoodsTypeService.class);//获取serviceImpl

        //去数据库查询，好处就是只去一次，查完就放 全局变量中（可以对比一下，放在session中，饼饼能用，念念拿不到。）
        List<GoodsType> list = goodsTypeService.findAll();
        //将list转为json串，
        String jsonStr = new ObjectMapper().writeValueAsString(list);
        //将数据存入上下文变量中
        sce.getServletContext().setAttribute("gtList",jsonStr);
        sce.getServletContext().setAttribute("goodsTypeList",list);

        //品牌列表
        List<Brands> brandsList = goodsTypeService.getBrandList();
        String brandJsonStr = new ObjectMapper().writeValueAsString(brandsList);//转成json串
        //将数据存入上下文变量中
        sce.getServletContext().setAttribute("brandListStr",brandJsonStr);
        sce.getServletContext().setAttribute("brandsList",brandsList);
        System.out.println("brandsList...."+brandsList);
    }
}
